/*
 * AgencyReservation.java
 *
 * Created on 27 juil. 2008, 21:54:13
 */
 
package gla.centralhotel.uiweb.agencyscreens;

import com.sun.rave.web.ui.appbase.AbstractPageBean;
import com.sun.webui.jsf.component.DropDown;
import com.sun.webui.jsf.component.Label;
import com.sun.webui.jsf.model.DefaultTableDataProvider;
import com.sun.webui.jsf.model.Option;
import com.sun.webui.jsf.model.SingleSelectOptionsList;
import gla.centralhotel.model.Hotel;
import javax.faces.FacesException;
import gla.centralhotel.uiweb.treatment.HotelAndRoomTreatment;
import gla.centralhotel.uiweb.ApplicationBean;
import gla.centralhotel.uiweb.treatment.AuthenticationTreatment;
import gla.centralhotel.uiweb.RequestBean;
import gla.centralhotel.uiweb.SessionBean;
import gla.centralhotel.uiweb.treatment.SubscriptionTreatment;
import java.text.Normalizer.Form;
import javax.faces.event.ValueChangeEvent;

/**
 * <p>Page bean that corresponds to a similarly named JSP page.  This
 * class contains component definitions (and initialization code) for
 * all components that you have defined on this page, as well as
 * lifecycle methods and event handlers where you may add behavior
 * to respond to incoming events.</p>
 *
 * @author loicpark
 */
public class AgencyReservation extends AbstractPageBean {
    // <editor-fold defaultstate="collapsed" desc="Managed Component Definition">

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() throws Exception {
    }
    private Label lblAgencyName = new Label();

    public Label getLblAgencyName()
    {
        return lblAgencyName;
    }

    public void setLblAgencyName(Label l)
    {
        this.lblAgencyName = l;
    }
    private Label lblHotelName = new Label();

    public Label getLblHotelName()
    {
        return lblHotelName;
    }

    public void setLblHotelName(Label l)
    {
        this.lblHotelName = l;
    }
    private Label lblHotelAdress = new Label();

    public Label getLblHotelAdress()
    {
        return lblHotelAdress;
    }

    public void setLblHotelAdress(Label l)
    {
        this.lblHotelAdress = l;
    }
    private Label lblHotelSvcEqmt = new Label();

    public Label getLblHotelSvcEqmt()
    {
        return lblHotelSvcEqmt;
    }

    public void setLblHotelSvcEqmt(Label l)
    {
        this.lblHotelSvcEqmt = l;
    }
    private DropDown ddlHotel = new DropDown();

    public DropDown getDdlHotel()
    {
        return ddlHotel;
    }

    public void setDdlHotel(DropDown dd)
    {
        this.ddlHotel = dd;
    }
    private DropDown ddlVille = new DropDown();

    public DropDown getDdlVille()
    {
        return ddlVille;
    }

    public void setDdlVille(DropDown dd)
    {
        this.ddlVille = dd;
    }

    // </editor-fold>

    /**
     * image de la liste des hotel du sessionban
     */
    Option[] HotelOptList;
    private Label lblHotelDescription = new Label();

    public Label getLblHotelDescription()
    {
        return lblHotelDescription;
    }

    public void setLblHotelDescription(Label l)
    {
        this.lblHotelDescription = l;
    }
    
    /**
     * <p>Construct a new Page bean instance.</p>
     */
    public AgencyReservation() {
    }

    /**
     * <p>Callback method that is called whenever a page is navigated to,
     * either directly via a URL, or indirectly via page navigation.
     * Customize this method to acquire resources that will be needed
     * for event handlers and lifecycle methods, whether or not this
     * page is performing post back processing.</p>
     * 
     * <p>Note that, if the current request is a postback, the property
     * values of the components do <strong>not</strong> represent any
     * values submitted with this request.  Instead, they represent the
     * property values that were saved for this view when it was rendered.</p>
     */
    @Override
    public void init() {
        // Perform initializations inherited from our superclass
        super.init();
        // Perform application initialization that must complete
        // *before* managed components are initialized
        // TODO - add your own initialiation code here
        
        // <editor-fold defaultstate="collapsed" desc="Managed Component Initialization">
        // Initialize automatically managed components
        // *Note* - this logic should NOT be modified
        try {
            _init();
        } catch (Exception e) {
            log("AgencyReservation Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e: new FacesException(e);
        }
        
        // </editor-fold>
        // Perform application initialization that must complete
        // *after* managed components are initialized
        // TODO - add your own initialization code here
        

        //initializeHotelList();
    }

    /**
     * <p>Callback method that is called after the component tree has been
     * restored, but before any event processing takes place.  This method
     * will <strong>only</strong> be called on a postback request that
     * is processing a form submit.  Customize this method to allocate
     * resources that will be required in your event handlers.</p>
     */
    @Override
    public void preprocess() {
    }

    /**
     * <p>Callback method that is called just before rendering takes place.
     * This method will <strong>only</strong> be called for the page that
     * will actually be rendered (and not, for example, on a page that
     * handled a postback and then navigated to a different page).  Customize
     * this method to allocate resources that will be required for rendering
     * this page.</p>
     */
    @Override
    public void prerender() {
        
        
        this.lblAgencyName.setText( getSessionBean().getCurrentAgency().getName() );
        
        if(getSessionBean().getHotelList() == null)
        {
            this.getSessionBean().loadHotelList();
        }
        else
        {
            Integer zipcodeId = (Integer)ddlVille.getSelected() ;
            getSessionBean().loadHotelListByZipcode(zipcodeId);
        }
        
        initializeHotelList();
    }

    /**
     * <p>Callback method that is called after rendering is completed for
     * this request, if <code>init()</code> was called (regardless of whether
     * or not this was the page that was actually rendered).  Customize this
     * method to release resources acquired in the <code>init()</code>,
     * <code>preprocess()</code>, or <code>prerender()</code> methods (or
     * acquired during execution of an event handler).</p>
     */
    @Override
    public void destroy() {
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected HotelAndRoomTreatment gettreatment$HotelAndRoomTreatment()
    {
        return (HotelAndRoomTreatment) getBean("treatment$HotelAndRoomTreatment");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected ApplicationBean getApplicationBean()
    {
        return (ApplicationBean) getBean("ApplicationBean");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected AuthenticationTreatment gettreatment$AuthenticationTreatment()
    {
        return (AuthenticationTreatment) getBean("treatment$AuthenticationTreatment");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected RequestBean getRequestBean()
    {
        return (RequestBean) getBean("RequestBean");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected SessionBean getSessionBean()
    {
        return (SessionBean) getBean("SessionBean");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected SubscriptionTreatment gettreatment$SubscriptionTreatment()
    {
        return (SubscriptionTreatment) getBean("treatment$SubscriptionTreatment");
    }

    public Option[] getHotelOptList()
    {
        return HotelOptList;
    }

    public void setHotelOptList(Option[] HotelOptList)
    {
        this.HotelOptList = HotelOptList;
    }

    
    
    public void ddlHotel_processValueChange(ValueChangeEvent event)
    {
        Integer hotelId = (Integer)this.ddlHotel.getSelected();
        this.getSessionBean().loadRoomBookingListByHotelId(hotelId);
        
        Hotel[] hl = getSessionBean().getHotelList();
        Hotel h = new Hotel();
        for (int i = 0; i < hl.length; i++)
        {
            if(hl[i].getId().equals(hotelId))
            {
                h=hl[i];
                System.out.println("[debug]: Hotel trouvé");
                break;
            }
        }
                
        getSessionBean().setCurrentHotel(h);
        
        this.lblAgencyName.setText( h.getName() );
        this.lblHotelAdress.setText( h.getAddress1() + " " + h.getAddress2() + " " + h.getAddress3());
        this.lblHotelSvcEqmt.setText(h.getServicesEquipments());
        this.lblHotelDescription.setText(h.getDescription());        
        
        ddlHotel.setSelected(hotelId);
    }

    public void ddlVille_processValueChange(ValueChangeEvent event)
    {
        //filtrer la liste des hotel dans le sessionbean

        Integer zipcodeId;
        try
        {
          zipcodeId = (Integer)ddlVille.getSelected();
          System.out.println("[debug]: cast to Integer");
        }
        catch(Exception e)
        {
            zipcodeId = Integer.valueOf( (String) ddlVille.getSelected() );
            System.out.println("[debug]: cast to String");
        }
        
        ddlVille.setSelected(zipcodeId);
        
    }
    
    private void initializeHotelList()
    {
        Hotel[] hl = getSessionBean().getHotelList();
        HotelOptList = new Option[hl.length];
        for (int i = 0; i < hl.length ; i++)
        {
            Hotel h = hl[i];
            HotelOptList[i] = new Option(h.getId(), h.getName(), h.getDescription());
        }
    }


    
}

